/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "UI/Widget.h"
#include "UI/ui绘制模板.h"
#include "UI/布局.h"


class C_行编辑框 : public C_文本框 {
	
public:
	C_行编辑框(S_UI渲染环境& ctx);
	~C_行编辑框();

	
	uint32 m_图标;
	uint32 m_高亮;
	

			void	f_绑定事件重置();
	virtual bool	f_使用子类拖放事件();

	void	f_置光标索引();
	void	f_开启输入();
	void	f_set对齐偏移();
	void	f_输入完成();
	void	f_拷贝();
	void	f_插入文本(const std::vector<std::u16string>& texts);

	S_Props f_getProp() { return m_自定义属性; }

	void	f_bind属性(S_Props& prop);
};

//bool f_行编辑框开启编辑(C_Widget* self, const E_鼠标按钮& 按钮);
bool f_行编辑框_控制键输入(C_文本框* self, const S_键盘& ks);

//vec2 f_行编辑框_计算光标位置(C_文本框* self, float32 文字间隔);
void f_行编辑框_Ascii文本输入(C_行编辑框* box, const S_键盘& ks);
void f_行编辑框_输入法文本输入(C_行编辑框* box, const S_键盘& ks);
void f_行编辑框_退回字符(C_行编辑框* box);
//bool f_行编辑框_删除选取(C_行编辑框* box);





class C_文本编辑框 : public C_文本框 {
	
public:
	C_文本编辑框(S_UI渲染环境& ctx, std::u16string 字体名称);
	~C_文本编辑框();

	S_Surface2D* m_背景;
	S_Surface2D* m_线条;
	S_Surface2D* m_字符;
	S_Surface2D* m_光标;


	C_Widget* mui_代码提示菜单;
	C_Widget* mui_文本操作菜单;

	std::vector<ivec3> m_代码包裹;


	void f_插入字符(wchar_t t, ivec2 pos);
	void f_删除字符(ivec2 pos);
	void f_插入行(uint32 pos);
	void f_删除行(uint32 pos);
	void f_清除字符();

	void f_添加行大小(uint32 num);
	void f_减少行大小(uint32 num);
	void f_置光标索引();
	void f_插入文本(const std::vector<std::u16string>& texts);
	void f_拷贝();
	void f_粘贴();
	void f_剪切();
	bool f_拆分行(ivec2 光标);
	vec2 f_光标绘制坐标();
	void f_开启输入();
	int32 f_删除选择字符();

	void			f_包裹区移动(int32 行);
	ivec2			f_计算光标索引();
	uint32			f_构建正向选择区间(ivec2& 开始行列, ivec2& 结束行列);
	std::u16string	f_取选择文本();

};



void f_edit_删除选取文本(C_文本框* 文本框);

